#!/bin/sh /etc/rc.common
# Copyright (C) 2015 OpenWrt.org

START=90
STOP=10

USE_PROCD=1
PROG=/usr/sbin/clamd
CLAMD_CONFIGFILE="/tmp/clamav/clamd.conf"

validate_clamav_section() {
	uci_load_validate clamav clamav "$1" "$2" \
		'clamd_config_file:string' \
		'LogVerbose:string' \
		'LogTime:string' \
		'Debug:string' \
		'LogSyslog:string' \
		'LogFacility:string' \
		'ExtendedDetectionInfo:string' \
		'OfficialDatabaseOnly:string' \
		'StreamMinPort:uinteger' \
		'StreamMaxPort:uinteger' \
		'MaxThreads:uinteger' \
		'ReadTimeout:uinteger' \
		'CommandReadTimeout:uinteger' \
		'MaxDirectoryRecursion:uinteger' \
		'FollowDirectorySymlinks:string' \
		'FollowFileSymlinks:string' \
		'SelfCheck:uinteger' \
		'DetectPUA:string' \
		'ScanPE:string' \
		'DisableCertCheck:string' \
		'ScanELF:string' \
		'AlertBrokenExecutables:string' \
		'ScanOLE2:string' \
		'ScanPDF:string' \
		'ScanSWF:string' \
		'ScanMail:string' \
		'ScanPartialMessages:string' \
		'ScanArchive:string' \
		'TemporaryDirectory:string' \
		'AlertEncrypted:string' \
		'MaxFileSize:string' \
		'LocalSocket:string' \
		'TCPSocket:port' \
		'TCPAddr:ipaddr' \
		'User:string' \
		'ExitOnOOM:string' \
		'DatabaseDirectory:string'
}

start_clamav_instance() {
	[ "$2" = 0 ] || {
		echo "validation failed"
		return 1
	}

	mkdir -p "$DatabaseDirectory"
	mkdir -p /etc/clamav/
	mkdir -p /var/run/clamav/
	chmod a+rw /var/run/clamav

	mkdir -p "$(dirname $CLAMD_CONFIGFILE)"
	ln -sf "$clamd_config_file" "$CLAMD_CONFIGFILE"

	{
	[ -n "$LogVerbose" ]				&& echo "LogVerbose " "$LogVerbose"
	[ -n "$LogTime" ]					&& echo "LogTime " "$LogTime"
	[ -n "$Debug" ]						&& echo "Debug " "$Debug"
	[ -n "$LogSyslog" ]					&& echo "LogSyslog " "$LogSyslog"
	[ -n "$LogFacility" ]				&& echo "LogFacility " "$LogFacility"
	[ -n "$ExtendedDetectionInfo" ]		&& echo "ExtendedDetectionInfo " "$ExtendedDetectionInfo"
	[ -n "$OfficialDatabaseOnly" ]		&& echo "OfficialDatabaseOnly " "$OfficialDatabaseOnly"
	[ -n "$StreamMinPort" ]				&& echo "StreamMinPort " "$StreamMinPort"
	[ -n "$StreamMaxPort" ]				&& echo "StreamMaxPort " "$StreamMaxPort"
	[ -n "$MaxThreads" ]				&& echo "MaxThreads " "$MaxThreads"
	[ -n "$ReadTimeout" ]				&& echo "ReadTimeout " "$ReadTimeout"
	[ -n "$CommandReadTimeout" ]		&& echo "CommandReadTimeout " "$CommandReadTimeout"
	[ -n "$MaxDirectoryRecursion" ]		&& echo "MaxDirectoryRecursion " "$MaxDirectoryRecursion"
	[ -n "$FollowDirectorySymlinks" ]	&& echo "FollowDirectorySymlinks " "$FollowDirectorySymlinks"
	[ -n "$FollowFileSymlinks" ]		&& echo "FollowFileSymlinks " "$FollowFileSymlinks"
	[ -n "$SelfCheck" ]					&& echo "SelfCheck " "$SelfCheck"
	[ -n "$DetectPUA" ]					&& echo "DetectPUA " "$DetectPUA"
	[ -n "$ScanPE" ]					&& echo "ScanPE " "$ScanPE"
	[ -n "$DisableCertCheck" ]			&& echo "DisableCertCheck " "$DisableCertCheck"
	[ -n "$ScanELF" ]					&& echo "ScanELF " "$ScanELF"
	[ -n "$AlertBrokenExecutables" ]	&& echo "AlertBrokenExecutables " "$AlertBrokenExecutables"
	[ -n "$ScanOLE2" ]					&& echo "ScanOLE2 " "$ScanOLE2"
	[ -n "$ScanPDF" ]					&& echo "ScanPDF " "$ScanPDF"
	[ -n "$ScanSWF" ]					&& echo "ScanSWF " "$ScanSWF"
	[ -n "$ScanMail" ]					&& echo "ScanMail " "$ScanMail"
	[ -n "$ScanPartialMessages" ]		&& echo "ScanPartialMessages " "$ScanPartialMessages"
	[ -n "$ScanArchive" ]				&& echo "ScanArchive " "$ScanArchive"
	[ -n "$TemporaryDirectory" ]		&& echo "TemporaryDirectory " "$TemporaryDirectory"
	[ -n "$AlertEncrypted" ]			&& echo "AlertEncrypted " "$AlertEncrypted"
	[ -n "$MaxFileSize" ]				&& echo "MaxFileSize " "$MaxFileSize"
	[ -n "$User" ]						&& echo "User " "$User"
	[ -n "$ExitOnOOM" ]					&& echo "ExitOnOOM " "$ExitOnOOM"
	[ -n "$DatabaseDirectory" ]			&& echo "DatabaseDirectory " "$DatabaseDirectory"
	} > "$CLAMD_CONFIGFILE"

	if [ -n "$LocalSocket" ]; then
		echo "LocalSocket " "$LocalSocket" >>"$CLAMD_CONFIGFILE"
	fi

	if [ -n "$TCPSocket" ]; then
		echo "TCPAddr" "$TCPAddr" >>"$CLAMD_CONFIGFILE"
		echo "TCPSocket " "$TCPSocket" >>"$CLAMD_CONFIGFILE"
	fi

	procd_open_instance
	procd_set_param command $PROG -c $CLAMD_CONFIGFILE
	procd_set_param file $CLAMD_CONFIGFILE
	procd_close_instance
}

start_service()
{
	validate_clamav_section clamav start_clamav_instance
}

stop_service()
{
	service_stop $PROG
}

service_triggers()
{
	procd_add_reload_trigger "clamav"
	procd_add_validation validate_clamav_section
}
